package com.t.bricks.bussiness.controller.login;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.t.bricks.bussiness.server.login.LoginServer;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 登录服务控制器
 */
@RestController
@RequestMapping("/login/")
@Api(value="登录服务", tags={"基本系统-登录服务操作接口"})
public class LoginController {

	@Autowired
	private LoginServer loginServer;

	@Value("${app.key:配置文件没有配置app.key}")
	private String appKey;

	/**
	 * 登录,如果用户和密码正确则返回同行令牌
	 * @param sNameOrNo 名称或工号
	 * @param sPass 密码
	 * @param sOwner 用户来源表
	 * @param iDevice 设备类型,1:PC,2:手机,3:平板,4.....
	 * @return
	 */
	//[start]
	@ApiOperation(value="登录", notes="如果用户和密码正确则返回通行令牌")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sNameOrNo", value="名称或工号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sPass", value="密码", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sOwner", value="用户来源表(如:BricksBaseSystem.LoginUser)", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="iDevice", value="设备类型,1:PC,2:手机,3:平板,4.....", dataType="Integer", paramType="query", required=false)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值/令牌}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性,如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8000, message="登录名不能为空"),
		@ApiResponse(code=8001, message="密码不能为空"),
		@ApiResponse(code=8002, message="查询失败,请稍后重试"),
		@ApiResponse(code=8003, message="相关登录名的用户不存在"),
		@ApiResponse(code=8004, message="存在重名用户,请使用工号登录"),
		@ApiResponse(code=8005, message="用户密码错误"),
		@ApiResponse(code=8006, message="登录受限,可能用户账号被封"),
		@ApiResponse(code=8007, message="用户来源不能为空！")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/in")
	public MsgEmity in(String sNameOrNo, String sPass, String sOwner, Integer iDevice) {
		return loginServer.in(sNameOrNo, sPass, sOwner, iDevice);
	}

	/**
	 * 用户登出
	 * @param sCookie
	 * @return
	 */
	//[start]
	@ApiOperation(value="注销/登出")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sCookie", value="令牌", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性,如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="本身已经登出"),
		@ApiResponse(code=8002, message="令牌参数缺失"),
		@ApiResponse(code=8999, message="登出成功")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/out")
	public MsgEmity out(String sCookie) {
		return loginServer.out(sCookie);
	}

	/**
	 * 判断sCookie是否已经登录
	 * @param sCookie
	 * @return
	 */
	//[start]
	@ApiOperation(value="判断令牌是否有效", notes="sCookie有效则说明在登录状态中")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sCookie", value="令牌", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性,如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="该登录令牌信息失效"),
		@ApiResponse(code=8002, message="令牌参数缺失"),
		@ApiResponse(code=8999, message="该登录令牌信息有效")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/check")
	public MsgEmity check(String sCookie) {
		return loginServer.check(sCookie);
	}

	/**
	 * 登录心跳操作,sCookie存在则更新并返回true,没有则返回false
	 * @param sCookie
	 * @return
	 */
	//[start]
	@ApiOperation(value="维持登录的心跳操作", notes="sCookie存在则更新并返回true,没有则返回false")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sCookie", value="令牌", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性,如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="令牌已失效,请重新登录"),
		@ApiResponse(code=8002, message="令牌参数缺失"),
		@ApiResponse(code=8999, message="令牌心跳已经更新")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/heartbeat")
	public MsgEmity heartbeat(String sCookie) {
		return loginServer.heartbeat(sCookie);
	}
	
	/**
	 * 取登录用户信息,注意:限制为内部系统访问
	 * @param key
	 * @param sCookie
	 * @return
	 */
	//[start]
	@ApiOperation(value="内部方法:取令牌对应的登录用户简洁信息", notes="注意:限制为内部系统(生产者系统)访问")
	@ApiImplicitParams({
		@ApiImplicitParam(name="key", value="访问本系统的密钥", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sCookie", value="令牌", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值/用户简易信息Json对象}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性,如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="令牌已失效,请重新登录"),
		@ApiResponse(code=8002, message="令牌参数缺失")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/info")
	public MsgEmity getLogin(String key, String sCookie) {
		if (null == key || "".equals(key.trim()) || !key.equals(appKey)) {
			return new MsgEmity(false, "验证密钥错误", 90);
		}
		
		return loginServer.getLogin(sCookie);
	}
	
	/**
	 * 取当前登录用户简洁信息
	 * @param request
	 * @return
	 */
	//[start]
	@ApiOperation(value="取当前登录用户简洁信息")
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值/用户简易信息Json对象}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性,如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8001, message="令牌已无效,限制获取登录信息")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/info/current")
	public MsgEmity getCurrentLogin(HttpServletRequest request) {
		String sCookie = ModuleUtil.currentRequestParam("sCookie");//获取当前线程下的request对象中的参数,优先: 头信息->参数-->属性
		if (null == sCookie || "".equals(sCookie.trim())) {
			return MsgEmity.err(8001, "令牌已无效,限制获取登录信息");
		}
		
		return loginServer.getLogin(sCookie);
	}

	/**
	 * 根据用户和密码取对应的用户编号
	 * @param sNameOrNo
	 * @param sPass
	 * @param sOwner 用户来源表
	 * @return
	 */
	//[start]
	@ApiOperation("根据用户和密码取对应的用户编号")
	@ApiImplicitParams({
		@ApiImplicitParam(name="sNameOrNo", value="名称或工号", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sPass", value="密码", dataType="String", paramType="query", required=true),
		@ApiImplicitParam(name="sOwner", value="用户来源表", dataType="String", paramType="query", required=true)
	})
	@ApiResponses({
		@ApiResponse(code=200, message="{\"success\": 布尔值, \"msg\": 文字提示, \"data\": 码值/令牌}"),
		@ApiResponse(code=400, message="错误的请求,请检查路径"),
		@ApiResponse(code=404, message="请求路径没有或页面跳转路径不对"),
		@ApiResponse(code=1000001, message="内部请求密钥错误"),
		@ApiResponse(code=1000002, message="您还没有登录或登录已超时,需要重新登录"),
		@ApiResponse(code=1000003, message="检查登录状态失败,请稍后重试！"),
		@ApiResponse(code=1000004, message="请求的操作不存在,请检查访问地址正确性,如大小写"),
		@ApiResponse(code=1000005, message="响应后在系统内部发生不可预知的错误"),
		@ApiResponse(code=1019000, message="1019000~1999999为拦截器调用方法错误"),
		@ApiResponse(code=8000, message="登录名不能为空"),
		@ApiResponse(code=8001, message="密码不能为空"),
		@ApiResponse(code=8002, message="查询失败,请稍后重试"),
		@ApiResponse(code=8003, message="相关登录名的用户不存在"),
		@ApiResponse(code=8004, message="存在重名用户,请使用工号登录"),
		@ApiResponse(code=8005, message="用户密码错误"),
		@ApiResponse(code=8006, message="登录受限,可能用户账号被封"),
		@ApiResponse(code=8007, message="用户来源不能为空")
	})
	//[end]
	@RequestMapping(method={RequestMethod.POST}, value="/getid")
	public MsgEmity getUserId(String sNameOrNo, String sPass, String sOwner) {
		return loginServer.getUserId(sNameOrNo, sPass, sOwner);
	}

}
